package haut.system.member.events;

import haut.data.SystemData;
import haut.system.member.person.Judge;
import haut.system.member.person.Player;
import haut.util.*;
import haut.util.exception.DataException;
import haut.util.exception.DuplicationException;

import java.util.Vector;

import javax.xml.crypto.Data;

/**
 * 项目类
 * @author zhujun
 * @author MingJie Li
 * */

final public class SportingEvents {

    /**
     * 项目序号
     */
    String id;

    /**
     * 项目名称*/
    String name;

    /**
     * 项目开始时间
     * */
    Time time;

    /** 项目举办地点
     * */
    String place;

    /**
     * 项目规则
     */
    String rule;

    /**
     * 项目裁判
     */
    Judge judge = null;

    /**
     * 参赛选手
     */
    Vector<Player> player = new Vector<Player>();

    /**
     *  构造函数
     *  */
    public SportingEvents(String id, String name, Time time, String place, String rule)
            throws DataException {
        // 检查数据合法性
        DataCheck.eventsCheck(id, name, time, place);
        this.id =id;
        this.name = name;
        this.time = time;
        this.place = place;
        this.rule = rule;
    }

    /**
     * 判断项目是否有裁判员。
     * @return {boolean}
     */
    public boolean hasJudge() {
        if(this.judge != null)
            return true;
        return false;
    }

    /**
     * 设置项目裁判员
     * @param judge 裁判员
     */
    public void setJudge(Judge judge) throws DuplicationException {
        if(hasJudge())
            throw new DuplicationException("已有裁判员！");
        this.judge = judge;
    }

    /**
     * 获取项目序号
     * @return {String} id
     */
    public String getId() {
        return id;
    }

    /**
     * 设置项目编号
     * @param id 项目序号
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取项目名称
     * @return {String} name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置项目名称
     * @param name 项目名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取项目开设时间
     * @return {String} time
     */
    public String getTime() {
        return time.year + "/" + time.month + "/" + time.day;
    }

    /**
     * 设置项目开设时间
     * @param time 项目开设时间
     */
    public void setTime(Time time) {
        this.time = time;
    }

    /**
     * 获取项目开设地点
     * @return {String} place
     */
    public String getPlace() {
        return place;
    }

    /**
     * 设置项目开设地点
     * @param place 项目开设地点
     */
    public void setPlace(String place) {
        this.place = place;
    }

    /**
     * 获取项目规则
     * @return {String} rule
     */
    public String getRule() {
        return rule;
    }

    /**
     * 设置项目规则
     * @param rule 项目规则
     */
    public void setRule(String rule) {
        this.rule = rule;
    }

    /**
     * 输出项目信息
     */
    public void print() {
        System.out.println("项目编号：" + getId());
        System.out.println("项目名称：" + getName());
        System.out.println("开设时间：" + getTime());
        System.out.println("开设地点：" + getPlace());
        System.out.print("项目规则：" + getRule());
    }

    /**
     * 获取项目中所有参赛选手的集合
     * @return {Vector} competitor
     */
    public Vector<Player> getPlayer() {
        return player;
    }

    /**
     * 获取项目裁判类
     * @return {Judge} judge
     */
    public Judge getJudge() {
        return judge;
    }

    /**
     * 在项目中新增参赛选手
     * @param player 参赛选手
     * @author zhujun
     */
    protected SystemData data = SystemData.getInstance();//系统数据
    private Vector<Player> allPlayer = data.getAllPlayer();//获取系统中的所有运动员
    public void addPlayer(Player player1) {
        // 在项目里和allPlayer中加入该运动员
        // 记得检查
        int len = this.getPlayer().size();
        Player player0;
        int flag = 0;
        for(int i=0;i<len;++i) {
            player0 = player.get(i);
            if(player0.equals(player1)) {
                flag = 1;
                System.out.println("运动员"+player1+"已参加"+this.getName());
            }
        }
        if(flag==0) {//该运动员未参加此项目
            this.player.add(player1);//在项目中添加该运动员
            System.out.println("在该项目中成功添加该运动员!");
            if(player1.isPlayer()) {//如果player1还不是运动员
                allPlayer.add(player1);//将运动员加入allPlayer中
                System.out.println("该运动员成功添加到allPlayer中!");
            }
        }
    }

    /**
     * 查看该项目所有选手的排名
     * @author zhujun
     */
    public void checkRanking() {
        int len = this.getPlayer().size();
        for(int i=0;i<len;++i) {//遍历该项目的所有的参赛选手
            player.get(i).checkMyRankOfEvent(this.getId());//该运动员在该项目下的排名
        }
    }

    /**
     * 查看该项目中的个人得分
     * @param id 运动员学/工号
     * @author zhujun
     * */
    public void checkPersonalScore(String id) {
        int len = this.getPlayer().size();
        for(int i=0;i<len;++i) {//遍历该项目的所有的参赛选手
            player.get(i).checkMyScoreOfEvent(id);
        }
    }
}
